复制集

概述

在分布式系统中,数据的高可用性和容错性是至关重要的。MongoDB 通过复制集(Replica Set)来实现这一目标。复制集是一组 MongoDB 实例,它们共同维护相同的数据集。其中一个实例作为主节点(Primary),负责处理所有的写操作;其他实例作为从节点(Secondary),负责复制主节点的数据,并在主节点失效时接管服务。

复制集的工作原理

主节点和从节点

  • 主节点(Primary):主节点是唯一能够处理写操作的节点。所有的写操作都会被记录到主节点的操作日志(Oplog)中。
  • 从节点(Secondary):从节点通过复制主节点的 Oplog 来同步数据。从节点可以处理读操作,但不能处理写操作。

选举机制

当主节点失效时,复制集会通过选举机制选出一个新的主节点。选举过程由复制集中的大多数节点参与,确保系统的稳定性和一致性。

配置复制集

步骤 1:启动 MongoDB 实例

首先,我们需要启动多个 MongoDB 实例,每个实例代表复制集中的一个节点。

# 启动第一个实例
mongod --replSet myReplSet --port 27017 --dbpath /data/db1

# 启动第二个实例
mongod --replSet myReplSet --port 27018 --dbpath /data/db2

# 启动第三个实例
mongod --replSet myReplSet --port 27019 --dbpath /data/db3

步骤 2:初始化复制集

连接到其中一个实例,并初始化复制集。

mongo --port 27017

在 MongoDB Shell 中执行以下命令:

rs.initiate(
  {
    _id: "myReplSet",
    members: [
      { _id: 0, host: "localhost:27017" },
      { _id: 1, host: "localhost:27018" },
      { _id: 2, host: "localhost:27019" }
    ]
  }
)

步骤 3:验证复制集状态

使用 rs.status() 命令查看复制集的状态。

rs.status()

实践练习

练习 1:创建和查询文档

在主节点上创建一个文档,并在从节点上查询该文档。

// 在主节点上创建文档
db.myCollection.insertOne({ name: "Alice", age: 30 })

// 在从节点上查询文档
mongo --port 27018
rs.slaveOk()
db.myCollection.find()

练习 2:模拟主节点失效

停止主节点,观察从节点如何接管服务。

# 停止主节点
kill -9 <primary_pid>

在 MongoDB Shell 中查看复制集状态,确认新的主节点已经选举出来。

rs.status()

总结

通过本教程,我们了解了 MongoDB 复制集的基本概念、工作原理以及如何配置和使用复制集。复制集是确保数据高可用性和容错性的关键组件,掌握其使用方法对于构建稳定可靠的分布式系统至关重要。

下一步

  • 学习如何配置复制集的优先级和延迟节点。
  • 探索复制集的故障恢复和自动故障转移机制。
  • 深入研究 MongoDB 的分片集群(Sharded Cluster),以处理更大规模的数据。